package concurrent.chapter1;

//02讲、介绍四种Singleton方式的优缺点在多线程情况下
public class SingletonObject4 {
    private static SingletonObject4 instance;

    private SingletonObject4() {
        //empty
    }

    //double check方式，实现了懒加载、同一个实例、解决了性能问题
    //但可能会空指针异常
    public static SingletonObject4 getInstance() {
        if (null == instance) {
            synchronized (SingletonObject4.class) {
                //1号线程new了一个实例放入堆内存里，
                //但是类里的属性(如构造函数)初始化的时候并没有构造完，就已经返回了
                //2号线程执行到这里时发现instance不为null，就拿着直接用了，用的时候可能instance还没有初始化完成，这样会导致空指针异常
                //jvm在编译过程中进行了一些优化，重排序，JRT
                if (null == instance)
                    instance = new SingletonObject4();
            }
        }
        return SingletonObject4.instance;
    }

}
